package com.wcc.mpmultidb.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * 异步任务线程调度
 * 主要用于回写到朗新的数据库，保证本地库操作后及时响应给前端
 * @Author 吴大龙
 * @Date 2021/4/3 13:46
 */
@Configuration
public class AsyncThreadPoolConfig {

    /**
     * 线程池调度器
     * @return
     */
    @Bean("asyncTaskExecutor")
    public Executor asyncTaskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5);//核心线程数
        executor.setMaxPoolSize(10);//最大线程数
        executor.setQueueCapacity(200);// 用来缓冲执行任务的队列
        executor.setKeepAliveSeconds(60);//允许线程的空闲时间，当超过了核心线程之外的线程，在空闲时间到达之后会被销毁
        executor.setThreadNamePrefix("异步任务线程调度-");//线程池名的前缀
        //这里采用CallerRunsPolicy策略，当线程池没有处理能力的时候，
        // 该策略会直接在execute方法的调用线程中运行被拒绝的任务；如果执行程序已关闭，则会丢弃该任务
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        return executor;
    }
}
